using System;
using System.Collections;
using Curriculum.Utiles;
using LectorDatos = Curriculum.LectoresXML.LectorDatos;

namespace Curriculum.Modelo.Clases
{
	/// <summary>
	/// Summary description for Presentaciones.
	/// </summary>
	public class Presentaciones : ListaAbstracta
	{
		private string _nroVersion;
		private string _ultimoNroAsignado = "0";

		protected override Type GetTipoElemento()
		{
			return typeof(Presentacion);
		}


		public Presentaciones()
		{}

		public string NroVersion
		{
			get
			{
				return _nroVersion;
			}
			set
			{
				_nroVersion = value;
			}
		}

		public void ConstruirPresentaciones(string nroVersion)
		{			
			LectorDatos.LectorPresentaciones lector = new LectorDatos.LectorPresentaciones();			
			this.ConstruirPresentaciones(lector, nroVersion);
		}

		public void ConstruirPresentaciones(LectorDatos.LectorPresentaciones lector, string nroVersion)
		{
			this.NroVersion = (nroVersion==null) ? this.NroVersion : nroVersion;
			
			LectorDatos.Presentaciones presentacionesXML = lector.Leer(nroVersion);

			if (presentacionesXML != null)
			{
				if (presentacionesXML.Items != null)
				{
					foreach (LectorDatos.Presentacion presentacionsXML in presentacionesXML.Items)
					{
						this.AddNewPresentacion().ConstruirPresentacion(presentacionsXML);	
					}
				}
			}
			
			this._ultimoNroAsignado = this.GetUltimoNroAsignado();
		}

		public Presentacion AddNewPresentacion()
		{
			Presentacion presentacion = new Presentacion();
			this.lista.Add(presentacion);
			presentacion.IdPresentacion = IncrementarUltimoNroAsignado();
			
			return presentacion;
		}

		public Presentacion GetPresentacion(string idPresentacion)
		{
			if (TienePresentaciones())
			{
				foreach (Presentacion presentacion in this.lista)
				{
					if (presentacion.IdPresentacion == idPresentacion)
						return presentacion;
				}
			}
			return null;
		}
		
		public void Guardar()
		{
			LectorDatos.LectorPresentaciones lector = new LectorDatos.LectorPresentaciones();
			lector.Escribir(this.convertirAEstructura(), this.NroVersion);
		}
		
		public LectorDatos.Presentaciones convertirAEstructura()
		{
			LectorDatos.Presentaciones presentaciones = new LectorDatos.Presentaciones();
			ArrayList aListPresentacionesXML = new ArrayList();

			foreach (Presentacion presentacion in this.lista)
			{
				aListPresentacionesXML.Add(presentacion.ConvertirAEstructura());
			}

			presentaciones.Items = new LectorDatos.Presentacion[aListPresentacionesXML.Count];
			aListPresentacionesXML.CopyTo(presentaciones.Items);

			return presentaciones;
		}

		private bool TienePresentaciones()
		{
			return (this.lista != null);
		}

		private string GetUltimoNroAsignado()
		{
			if (this.lista.Count > 0)
			{
				Presentacion presentacion = (Presentacion) this.lista[this.lista.Count-1];
				return presentacion.IdPresentacion;
			}
			else
			{
				return "0";
			}
		}

		private string IncrementarUltimoNroAsignado()
		{
			int ultimoNumero = (int.Parse(this._ultimoNroAsignado) + 1);
			this._ultimoNroAsignado = ultimoNumero.ToString();
			return this._ultimoNroAsignado;
		}

	}
}
